package edu.client;

import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TabPanel;

import edu.client.ComprasService.ComprasService;
import edu.client.ComprasService.ComprasServiceAsync;
import edu.shared.DTO.OrdenCompraProductoDTO;
	
public class P_ImprimirOrdenCompraProducto extends Composite{
	
	//columna de la tabla de órdens de compra
	private static final int COL_CHECK = 0;
	private static final int COL_NUMERO_ORDEN = 1;
	private static final int COL_FECHA_GENERACION = 2;
	private static final int COL_PROVEEDOR = 3;
	private static final int COL_ESTADO_ORDEN = 4;
	private FlexTable ftOrdenes;
	
	private TabPanel tpPadre;	
	private ComprasServiceAsync comprasService;	
	private List<OrdenCompraProductoDTO> ordenes;
	
	public P_ImprimirOrdenCompraProducto(TabPanel padre)
	{
		tpPadre = padre;
		comprasService = GWT.create(ComprasService.class);
		
		LayoutPanel layoutPanel = new LayoutPanel();
		initWidget(layoutPanel);		
		layoutPanel.setSize((Window.getClientWidth() - 55) + "px", "452px");
				
		Label lblOrdenes = new Label("ÓRDENES DE COMPRA DE PRODUCTOS");
		lblOrdenes.setStyleName("labelTitulo");
		layoutPanel.add(lblOrdenes);
		layoutPanel.setWidgetLeftWidth(lblOrdenes, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblOrdenes, 15.0, Unit.PX, 50.0, Unit.PX);
		
		ScrollPanel spOrdenes = new ScrollPanel();
		spOrdenes.setStyleName("tabla");
		layoutPanel.add(spOrdenes);
		layoutPanel.setWidgetLeftWidth(spOrdenes, 5.0, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(spOrdenes, 85.0, Unit.PX, 250.0, Unit.PX);
		
		ftOrdenes = new FlexTable();
		spOrdenes.setWidget(ftOrdenes);
		ftOrdenes.setSize("100%", "100%");
		
		//columnas de la tabla de órdenes		
		
		//columna número de orden
		ftOrdenes.setText(0, COL_CHECK, "");
		ftOrdenes.getCellFormatter().setWidth(0, COL_CHECK, "5%");
		
		//columna número de orden
		ftOrdenes.setText(0, COL_NUMERO_ORDEN, "Nº ORDEN COMPRA");
		ftOrdenes.getCellFormatter().setWidth(0, COL_NUMERO_ORDEN, "10%");
		
		//columna fecha de generación
		ftOrdenes.setText(0, COL_FECHA_GENERACION, "FECHA DE GENERACIÓN");
		ftOrdenes.getCellFormatter().setWidth(0, COL_FECHA_GENERACION, "15%");
		
		//columna proveedor
		ftOrdenes.setText(0, COL_PROVEEDOR, "PROVEEDOR");
		ftOrdenes.getCellFormatter().setWidth(0, COL_PROVEEDOR, "45%");
		
		//columna estado orden
		ftOrdenes.setText(0, COL_ESTADO_ORDEN, "ESTADO");
		ftOrdenes.getCellFormatter().setWidth(0, COL_ESTADO_ORDEN, "25%");
		
		
		Label lblPie = new Label("");
		lblPie.setStyleName("labelTitulo");
		layoutPanel.add(lblPie);
		layoutPanel.setWidgetLeftWidth(lblPie, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblPie, 335.0, Unit.PX, 50.0, Unit.PX);
		
		Button btnSalir = new Button("");
		btnSalir.setText("CANCELAR");
		
		//al presionar el botón salir
		btnSalir.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				//cerramos la pantalla
				tpPadre.remove(Validaciones.numeroElemento(tpPadre, "IMPRIMIR ORDEN COMPRA PRODUCTO"));		
			}
		});
		
		layoutPanel.add(btnSalir);
		layoutPanel.setWidgetRightWidth(btnSalir, 5.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(btnSalir, 15.0, Unit.PX, 28.0, Unit.PX);
		
		Button btnImprimir = new Button("");
		btnImprimir.setText("IMPRIMIR");
		
		//al presionar el botón imprimir
		btnImprimir.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				
				//buscamos el radio button seleccionado de la tabla
				int i = 0;
				boolean encontrado = false;
				int idOrden = -1;
				
				while(i < ordenes.size() && !encontrado)
				{
					RadioButton radioButton = (RadioButton) ftOrdenes.getWidget(i+1, COL_CHECK);
					
					if(radioButton.getValue() == true)
					{
						encontrado = true;
						idOrden = ordenes.get(i).getIdOrden();
					}
					
					i++;
				}
				
				if(encontrado)
					imprimir(idOrden);

				else
					Window.alert("Seleccione la orden de compra a imprimir.");
				
			}
		});
		
		layoutPanel.add(btnImprimir);
		layoutPanel.setWidgetRightWidth(btnImprimir, 17.5, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(btnImprimir, 15.0, Unit.PX, 28.0, Unit.PX);
				
		// seteamos el estilo a los encabezados
		ftOrdenes.getRowFormatter().addStyleName(0, "tablaEncabezado");
		
		
		filtrarOrdenes();
	}
	
	/**
	 * Método que filtra las órdenes de compra de producto por el proveedores seleccionado.
	 * Si el proveedor es "< Todos >" se traen todas las órdenes de compra.
	 * @param proveedor. Proveedor seleccionado.
	 */
	private void filtrarOrdenes()
	{
		ftOrdenes.clear();
		
		comprasService.buscarOrdenesCompraProductoPorProveedor(null, "VALIDADA", new AsyncCallback<List<OrdenCompraProductoDTO>>()
		{
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO." + '\n' + '\n' + caught.getMessage());	
			}

			@Override
			public void onSuccess(List<OrdenCompraProductoDTO> result) {
				ordenes = result;
				
				//se utiliza para formatear fechas
				DateTimeFormat formatoFecha = DateTimeFormat.getFormat("dd/MM/yyyy");
				
				int numeroFila = 1;
				
				for(OrdenCompraProductoDTO orden : ordenes)
				{					
					//columna checkeo
					ftOrdenes.setWidget(numeroFila, COL_CHECK, new RadioButton("ordenSeleccionada"));
					ftOrdenes.getCellFormatter().setWordWrap(numeroFila, COL_CHECK, true);
					
					//columna número de orden
					ftOrdenes.setWidget(numeroFila, COL_NUMERO_ORDEN, new Label(String.valueOf(orden.getIdOrden())));
					ftOrdenes.getCellFormatter().setWordWrap(numeroFila, COL_NUMERO_ORDEN, true);
					
					//columna fecha generación
					ftOrdenes.setWidget(numeroFila, COL_FECHA_GENERACION, new Label(String.valueOf(formatoFecha.format(orden.getFechaGeneracion()))));
					ftOrdenes.getCellFormatter().setWordWrap(numeroFila, COL_FECHA_GENERACION, true);
					
					//columna proveedor
					ftOrdenes.setWidget(numeroFila, COL_PROVEEDOR, new Label(orden.getProveedor()));
					ftOrdenes.getCellFormatter().setWordWrap(numeroFila, COL_PROVEEDOR, true);
					
					//columna estado orden
					ftOrdenes.setWidget(numeroFila, COL_ESTADO_ORDEN, new Label(orden.getEstado()));
					ftOrdenes.getCellFormatter().setWordWrap(numeroFila, COL_ESTADO_ORDEN, true);
										
					//seteamos el estilo de renglón de tabla
					ftOrdenes.getRowFormatter().setStyleName(numeroFila, "tablaRenglon");
					
					numeroFila++;
				}
			}
		});
	}
	
	/**
	 * Método que muestra toda la información de una orden de compra
	 * @param idOrden
	 */
	private void imprimir(int idOrden)
	{
		P_DetalleOrdenCompraProducto pDetalleOrden = new P_DetalleOrdenCompraProducto(idOrden, true);
		pDetalleOrden.setGlassEnabled(true);
		pDetalleOrden.center();
		pDetalleOrden.show();
	}     
}